package cn.bonoon.kernel.io;



/**
 * <pre>
 * 具体的业务系统的所有文件的上传，都应该通过本接口来取得读取或保存文件的操作流或者打开文件句柄；
 * 文件的存储策略则应该的可控的，也就是说可以通过其它插件(如：虚拟文件系统插件)来管理具体文件的
 * 上传及读取操作。
 * </pre>
 * @author jackson
 *
 */
public interface FileManager {
	
	String LOCAL_STORED_CATALOG = "";
	String FILE_LOAD_URL = "/s/file/load.f";
	String FILE_OPEN_URL = "/s/file/open.f";
	String FILE_REQUEST_PARAMETER = "_p";
	
	String OPEN_LOAD_URL = "/open/file/load.f";
	String OPEN_OPEN_URL = "/open/file/open.f";
	String OPEN_REQUEST_PARAMETER = "_p";
	String OPEN_REQUEST_AUTHORITY = "_s";
	String OPEN_REQUEST_TIMESTAMP = "_s";
	
	/** 加载文档，以直接打开或下载的方式，通过{@link HttpStorageFile}对象进行指定 */
	boolean load(HttpStorageFile hsFile) throws Exception;
	
	boolean checkAuthority(HttpStorageFile hsFile) throws Exception;
	
	boolean delete(StoragePersistable file) throws Exception;
	
	String loadPath(String path) throws Exception;
	String openPath(String path) throws Exception;
	
	String loadPath(StoragePersistable path) throws Exception;
	String openPath(StoragePersistable path) throws Exception;
	
	/** 如果需要调用到这个方法的，则一定会返回一个上传的文件，否则抛出异常 */
	FileInfo saveFile(StorageFile file) throws Exception;
	FileInfo[] saveFiles(StorageFile file) throws Exception;
	
	/** 尝试跳转，如果有远程的定义，则可以下载 */
	void redirectOpen(HttpStorageFile file) throws Exception;
	void redirectLoad(HttpStorageFile file) throws Exception;
	
//	String OPEN_REQUEST_TIMEMILLIS = "_t";
//	String OPEN_REQUEST_KEY = "_k";

//	/** 
//	 * 所有文件上传时定义的根目录，如：upload目录等；所有文件上传后，都会以这个目录开头的相对目录下；
//	 * 访问这个目录，必须要有相应的权限；
//	 * 也可以指定这个目录下的某些子目录放开访问的权限；
//	 */
//	String getRootPath();
	
//	/** 给定一个路径，把这个指定的路径与根路径进行组合 */
//	String getPath(String path);
	
//	/** 这里列出的不应该是服务器上的根目录；而是已经设定的系统存放上传文件的目录 */
//	File[] listRoots();
//	
//	/** 下载文件 */
//	boolean loadFile(HttpServletRequest request, HttpServletResponse response, String path, String name, String ext) throws Exception;
//	
//	/** 直接在浏览器上打开文件 */
//	boolean openFile(HttpServletRequest request, HttpServletResponse response, String path, String name, String ext) throws Exception;
//
//	/** 下载文件 */
//	boolean loadFile(HttpServletRequest request, HttpServletResponse response, String fullPath) throws Exception;
//	
//	/** 直接在浏览器上打开文件 */
//	boolean openFile(HttpServletRequest request, HttpServletResponse response, String fullPath) throws Exception;
	
//	/** 打开一个可写入文件的写入流，这里相对路径 */
//	OutputStream openOutputStream(String path) throws Exception;
//	
//	/** 打开一个可从文件读取内容的读取流 */
//	InputStream openInputStream(String path) throws Exception;
	
//	File getFile(String path) throws Exception;
	
//	String parsePath(String path);
	
}
